
#ifndef _Oz_Webui_ICacheable_H_
#define _Oz_Webui_ICacheable_H_

#include <Oz/Webui/Webui.h>

namespace Oz{
    namespace Webui{
       /**
        * Tipo para representar los tipos de cache que puede usar la pagina
        *  Nocache hace que la pagina envie el header No-Cache
        *  CachePermisive La pagina usa el valor Expired-date menor de los asignados
        *  CacheRestrictive la pagina usa el valor Expired-date mayor de los asignados.
        **/
        typedef enum {Nocache,CachePermisive,CacheRestrictive} CacheType;

       /**
        * Interfaz que debe implemenplementar un objeto cacheable.
        **/
        class ICacheable{
            public:
            virtual ~ICacheable();
           /**
            * Comprueba si la fecha de modificacion de un objeto es posterior, a una fecha
            **/
            virtual const bool ifModifiedSince(long date)const = 0;

           /**
            * Permite asignar el valor del atributo ETag
            * el etag es un uuid unico de version permite comprobar si un recurso a sido modificado comprobandolo
            * con esta version.
            **/
            virtual void setEtag(const std::string& etag) = 0;

           /**
            * Devuelve el id de version de este objeto.
            **/
            virtual const std::string getEtag()const = 0;

           /**
            * Devuelve la fecha de modificacion este objeto.
            **/
            virtual const long getModifiedDate()const = 0;

           /**
            * Permite asignar la fecha de la ultima modificacion de la pagina, 
            * Solo se cambia el atributo si el valor es mas reciente que el actualmente asignado.
            **/
            virtual void setModifiedDate(long date) = 0;

           /**
            * Permite establecer la fecha de caducidad.
            **/
            virtual void setExpiredDate(long date) = 0;

           /**
            * Fecha de caducidad
            **/
            virtual long getExpiredDate()const = 0;

           /**
            * Establece el tipo de cache que usa la pagina
            */
            virtual void setCacheType(CacheType type);

           /**
            * Permite acceder al tipo de cache.
            **/
            virtual const CacheType getCacheType()const = 0;

           /**
            * Devuelve el diccionario de datos cacheado.
            **/
            virtual IDictionaryPtr getDictionary()const = 0;

            //Protected interface
            protected:
            ICacheable();
            ICacheable(const ICacheable& other);
            ICacheable& operator=(const ICacheable& rhs);
        };
    }
}
#endif
